/**
 * SQL表结构转换为Markdown表格工具类
 */
export class SqlToMarkdown {
  /**
   * 将CREATE TABLE语句转换为Markdown表格
   * @param sqlText CREATE TABLE SQL文本
   * @returns Markdown表格文本
   */
  public static convert(sqlText: string): string {
    try {
      // 提取表名和注释
      const tableName = this.extractTableName(sqlText)
      const tableComment = this.extractTableComment(sqlText)

      // 解析所有字段
      const fields = this.parseFields(sqlText)

      // 生成Markdown表格
      return this.generateMarkdown(tableName, tableComment, fields)
    } catch (error) {
      console.error('SQL转Markdown失败:', error)
      return '转换失败: ' + (error instanceof Error ? error.message : String(error))
    }
  }

  /**
   * 提取表名
   * @param sqlText SQL文本
   * @returns 表名
   */
  private static extractTableName(sqlText: string): string {
    const tableNameRegex = /create\s+table\s+(\S+)/i
    const match = sqlText.match(tableNameRegex)
    if (match && match[1]) {
      // 去除可能的反引号或其他标识符
      return match[1].replace(/[`'"]/g, '')
    }
    return '未知表'
  }

  /**
   * 提取表注释
   * @param sqlText SQL文本
   * @returns 表注释
   */
  private static extractTableComment(sqlText: string): string {
    const tableCommentRegex = /comment\s*=?\s*['"](.+?)['"](\s*charset|$)/i
    const match = sqlText.match(tableCommentRegex)
    if (match && match[1]) {
      return match[1].trim()
    }
    return ''
  }

  /**
   * 解析字段信息
   * @param sqlText SQL文本
   * @returns 字段信息数组
   */
  private static parseFields(sqlText: string): Array<{
    name: string // 字段名
    type: string // 字段类型
    comment: string // 字段注释
    isNullable: boolean // 是否可为空
    defaultValue: string // 默认值
  }> {
    const fields: Array<{
      name: string
      type: string
      comment: string
      isNullable: boolean
      defaultValue: string
    }> = []

    // 提取字段定义部分
    const fieldSection = sqlText.substring(sqlText.indexOf('(') + 1, sqlText.lastIndexOf(')'))

    // 按逗号分割，但需要处理括号内的逗号
    let depth = 0
    let currentField = ''

    for (let i = 0; i < fieldSection.length; i++) {
      const char = fieldSection[i]
      if (char === '(') depth++
      else if (char === ')') depth--

      if (char === ',' && depth === 0) {
        // 找到字段分隔符
        this.processFieldDefinition(currentField.trim(), fields)
        currentField = ''
      } else {
        currentField += char
      }
    }

    // 处理最后一个字段
    if (currentField.trim()) {
      this.processFieldDefinition(currentField.trim(), fields)
    }

    return fields
  }

  /**
   * 处理单个字段定义
   * @param fieldDef 字段定义文本
   * @param fields 字段数组（结果会添加到这个数组中）
   */
  private static processFieldDefinition(fieldDef: string, fields: any[]): void {
    // 忽略主键、索引等非字段定义行
    if (
      fieldDef.startsWith('primary key') ||
      fieldDef.startsWith('key') ||
      fieldDef.startsWith('unique') ||
      fieldDef.startsWith('index') ||
      fieldDef.startsWith('constraint') ||
      fieldDef.trim().length === 0
    ) {
      return
    }

    // 提取字段名
    const nameMatch = fieldDef.match(/^\s*([`\w]+)\s+/)
    if (!nameMatch) return

    const name = nameMatch[1].replace(/[`'"]/g, '')

    // 提取类型
    const typeMatch = fieldDef.match(/^\s*[`\w]+\s+(\w+(\s*\(\s*\d+\s*(?:,\s*\d+\s*)?\))?)/i)
    const type = typeMatch ? typeMatch[1] : ''

    // 提取注释
    const commentMatch = fieldDef.match(/comment\s*['"](.+?)['"]/i)
    const comment = commentMatch ? commentMatch[1] : ''

    // 检查是否可为空
    const isNullable = !fieldDef.includes('not null')

    // 提取默认值
    const defaultMatch = fieldDef.match(/default\s+([^'\s]+|'[^']*')/i)
    const defaultValue = defaultMatch ? defaultMatch[1].replace(/['"]/g, '') : ''

    fields.push({
      name,
      type,
      comment,
      isNullable,
      defaultValue,
    })
  }

  /**
   * 生成Markdown表格
   * @param tableName 表名
   * @param tableComment 表注释
   * @param fields 字段数组
   * @returns Markdown表格文本
   */
  private static generateMarkdown(tableName: string, tableComment: string, fields: any[]): string {
    let markdown = `## ${tableComment || tableName}\n\n`

    markdown += `**表名：** \`${tableName}\`\n\n`
    if (tableComment) {
      markdown += `**说明：** ${tableComment}\n\n`
    }

    // 表头
    markdown += `| 序号 | 中文名称 | 字段名 | 字段类型 | 是否为空 | 默认值 | 备注 |\n`
    markdown += `| ---- | -------- | ------ | -------- | -------- | ------ | ---- |\n`

    // 表内容
    fields.forEach((field, index) => {
      markdown += `| ${index + 1} | ${field.comment} | ${field.name} | ${field.type} | ${field.isNullable ? '是' : '否'} | ${field.defaultValue || '-'} | |\n`
    })

    return markdown
  }

  /**
   * 自定义格式的Markdown生成
   * @param sqlText SQL文本
   * @returns 自定义格式的Markdown表格
   */
  public static convertCustomFormat(sqlText: string): string {
    try {
      // 解析所有字段
      const fields = this.parseFields(sqlText)

      // 生成自定义格式的Markdown表格
      let markdown = `| 序号 | 中文名称 | | 来源 | 字段 |\n`
      markdown += `| ---- | -------- | ---- | ---- | ---- |\n`

      // 表内容
      fields.forEach((field, index) => {
        markdown += `| ${index + 1} | ${field.comment} | ${field.name} | | ${field.name} |\n`
      })

      return markdown
    } catch (error) {
      console.error('SQL转自定义Markdown失败:', error)
      return '转换失败: ' + (error instanceof Error ? error.message : String(error))
    }
  }
}
